﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using EnviamentDeDocuments.ObjectesDeDades;

namespace EnviamentDeDocuments.Formularis
{
    public partial class frmPrincipal : Form
    {

        #region "Propietats"
        public bool Continuar { get; private set; }

        private List<Client> clientsSeleccionats;
        public List<Client> ClientsSeleccionats 
        {
            get 
            {
                if (clientsSeleccionats == null) clientsSeleccionats = new List<Client>();
                return clientsSeleccionats; 
            } 
            set 
            {
                clientsSeleccionats = value;
                for (int i=0; i<lstClients.Items.Count; i++)
                { 
                    lstClients.SetItemChecked(i, value!=null && value.Contains(lstClients.Items[i]));
                }
            }
               
        }

        private List<Impost> impostosSeleccionats;
        public List<Impost> ImpostosSeleccionats
        {
            get {return impostosSeleccionats;}
            set
            {
                impostosSeleccionats = value;
                for (int i = 0; i < lstImpostos.Items.Count; i++)
                {
                    lstImpostos.SetItemChecked(i, value != null && value.Contains(lstImpostos.Items[i]));
                }
            }
        }

        private List<Periode> periodesSeleccionats;
        public List<Periode> PeriodesSeleccionats
        {
            get { return periodesSeleccionats; }
            set
            {
                periodesSeleccionats = value;
                for (int i = 0; i < lstPeriodes.Items.Count; i++)
                {
                    lstPeriodes.SetItemChecked(i, value != null && value.Contains(lstPeriodes.Items[i]));
                }
            }
        }

        public Exercici exerciciSeleccionat;
        public Exercici ExerciciSeleccionat
        {
            get { return exerciciSeleccionat; }
            set
            {
                exerciciSeleccionat = value;
                if (value != null) cboExercici.SelectedItem = value;
            }
        }

        #endregion

        public frmPrincipal()
        {
            InitializeComponent();

            Continuar = false;
            ClientsSeleccionats = null;
            ImpostosSeleccionats = null;
            PeriodesSeleccionats = null;
            ExerciciSeleccionat = null;

            //Afegim els clients
            foreach (Client client in (from Client c in Contexte.getClients() orderby c.Nom select c) )
            {
                lstClients.Items.Add(client);
            }

            //Afegim els exercicis
            foreach (Exercici exercici in (from Exercici e in Contexte.getExercicis() orderby e.Any select e))
            {
                cboExercici.Items.Add(exercici);
                if (exercici.Any == DateTime.Today.Year)
                    cboExercici.SelectedItem = exercici;
            }

            //Afegim els impostos
            foreach (Impost impost in (from Impost i in Contexte.getImpostos() orderby i.Codi select i))
            {
                lstImpostos.Items.Add(impost);
            }

            //Afegim els Períodes
            foreach (Periode periode in (from Periode p in Contexte.getPeriodes() select p))
            {
                lstPeriodes.Items.Add(periode);
            }        
        }

        private void cmdTots_Click(object sender, EventArgs e)
        {            
            for (int i = 0; i<lstClients.Items.Count; i++)
            {
                lstClients.SetItemChecked(i, true);
            }
        }

        private void cmdCap_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < lstClients.Items.Count; i++)
            {
                lstClients.SetItemChecked(i, false);
            }
        }

        private void cmdEmpreses_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < lstClients.Items.Count; i++)
            {
                lstClients.SetItemChecked(i, ((Client)lstClients.Items[i]).esEmpresa());
            }
        }

        private void cmdParticulars_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < lstClients.Items.Count; i++)
            {
                lstClients.SetItemChecked(i, !((Client)lstClients.Items[i]).esEmpresa());
            }
        }

        private void cmdTotsPeriodes_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < lstPeriodes.Items.Count; i++)
            {
                lstPeriodes.SetItemChecked(i, true);
            }
        }

        private void cmdCapPeriodes_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < lstPeriodes.Items.Count; i++)
            {
                lstPeriodes.SetItemChecked(i, false);
            }
        }

        private void cmdTotsImpostos_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < lstImpostos.Items.Count; i++)
            {
                lstImpostos.SetItemChecked(i, true);
            }
        }

        private void cmdCapImpostos_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < lstImpostos.Items.Count; i++)
            {
                lstImpostos.SetItemChecked(i, false);
            }
        }

        private void cmdEnviar_Click(object sender, EventArgs e)
        {
            if (ValidacionsEnviar())
            {
                Continuar = true;
                exerciciSeleccionat = (Exercici)cboExercici.SelectedItem;

                refrescarLListaClientsSeleccionats();

                impostosSeleccionats = new List<Impost>();
                for (int i = 0; i < lstImpostos.Items.Count; i++)
                {
                    if (lstImpostos.GetItemChecked(i)) ImpostosSeleccionats.Add((Impost)lstImpostos.Items[i]);
                }

                periodesSeleccionats = new List<Periode>();
                for (int i = 0; i < lstPeriodes.Items.Count; i++)
                {
                    if (lstPeriodes.GetItemChecked(i)) PeriodesSeleccionats.Add((Periode)lstPeriodes.Items[i]);
                }

                this.Close();
            }
        }

        private bool ValidacionsEnviar()
        {
            if (NombreElementsSeleccionats(lstClients) == 0)
            {
                MessageBox.Show("Has de seleccionar com a mínim un client per continuar", "Error de dades", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            if (NombreElementsSeleccionats(lstPeriodes) == 0)
            {
                MessageBox.Show("Has de seleccionar com a mínim un període per continuar", "Error de dades", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            } 
            
            if (NombreElementsSeleccionats(lstImpostos) == 0)
            {
                MessageBox.Show("Has de seleccionar com a mínim un impost per continuar", "Error de dades", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            return true;
        }

        private int NombreElementsSeleccionats(CheckedListBox lst)
        {
            int resultat = 0;

            for (int i = 0; i < lst.Items.Count; i++)
            {
                if (lst.GetItemChecked(i)) resultat++;
            }

            return resultat;
        }

        private void txtBuscadorClients_TextChanged(object sender, EventArgs e) 
        {
            refrescarLListaClientsSeleccionats();

            List<Client> Clients = (from Client c in Contexte.getClients() orderby c.Nom select c).ToList<Client>();
            String SearchedText = txtBuscadorClients.Text.ToUpper();
            lstClients.Items.Clear();

            foreach (Client c in Clients)
            {
                if ((c.Nom != null && c.Nom.ToUpper().Contains(SearchedText)) || (c.Nif != null && c.Nif.ToUpper().Contains(SearchedText)) || (c.Email != null && c.Email.ToUpper().Contains(SearchedText)))
                {
                    lstClients.Items.Add(c);
                    if (ClientsSeleccionats.Contains(c)) lstClients.SetItemChecked(lstClients.Items.IndexOf(c), true);
                }
            }
        }


        private void refrescarLListaClientsSeleccionats()
        {
            for (int i = 0; i < lstClients.Items.Count; i++)
            {
                Client c = (Client)lstClients.Items[i];

                if (lstClients.GetItemChecked(i) && !ClientsSeleccionats.Contains(c))
                    ClientsSeleccionats.Add(c);
                else if (!lstClients.GetItemChecked(i) && ClientsSeleccionats.Contains(c))
                    ClientsSeleccionats.Remove(c);
            }
        }

    }
}
